El desarrollo del taller se llevó a cabo mediante implementaciones
en \texttt{python} utilizando la librería \texttt{python-scapy}.
En las primeras dos consignas se llevaron a cabo las pruebas pertinentes 
sobre las redes wi-fi abiertas de la facultad (laboratorio, aulas, entrepiso).
En los análisis de información se utilizaron los resultados propios.
Para trabajar los datos se utilizó \texttt{wireshark} para levantar información
y scripts en \texttt{python} con \texttt{pydot} para los grafos dirigidos y \texttt{R} para
estadística y gráficos.

\subsection{Primera consigna: implementación de un cliente ARP}

El cliente ARP se implementó bajo \textit{python} utilizando las
funciones de \textit{scapy} disponibles en la librería correspondiente.
Para esta primera consigna se estableció la función \texttt{enviar}
la cual recibe una dirección IP y una interfaz de salida, genera un
paquete ARP con esa IP y lo envía por broadcast ethernet. Captura la respuesta
y la muestra por consola. También se estableció la función \texttt{run}
la cual ejecuta \texttt{enviar} y calcula el tiempo de ejecución.

\lstset{language=python,title={Cliente ARP},caption={Cliente ARP}}
\begin{footnotesize}
  \begin{lstlisting}[frame=bottomline]
  def enviar(ip, interfaz):
    a = ARP()
    a.pdst = ip
    a.hwdst = "ff:ff:ff:ff:ff:ff"

    response = sr1(a, iface=interfaz)

    return response.summary()

  def run(ip, inter):
    t0 = time()
    arp = enviar(ip, inter)
    t1 = time()

    print arp
    print (t1-t0)*(10**3), "ms"

  ip = sys.argv[1]
  inter = sys.argv[2]	
  run(ip, inter)
  \end{lstlisting}
\end{footnotesize}

El cliente debe ejecutarse con permisos de administrador (root)
y requiere conocer la dirección IP y la interfaz por la cual realizar el envío.
Si bien la información obtenida variará según el entorno en donde se esté ejecutando,
se obtendrán datos similares a los siguientes:

\lstset{language=sh,caption={Respuesta del Cliente ARP}}
\begin{footnotesize}
  \begin{lstlisting}[frame=bottomline]
  Begin emission:
  WARNING: Mac address to reach destination not found. Using broadcast.
  Finished to send 1 packets.
  *
  Received 1 packets, got 1 answers, remaining 0 packets
  ARP is at 30:69:4b:0c:0c:c3 says 192.168.1.101
  192.168.1.101 2127.30383873 ms
  \end{lstlisting}
\end{footnotesize}

Si la dirección IP es conocida por el host que envía no le es necesario
hacer broadcast. Esto se puede ver dado que no aparecerá el \textit{warning} de broadcast.
Si se le sumistra una dirección se red inexistente, el cliente ARP
envía un pedido a la dirección broadcast \texttt{255.255.255.255}
y se queda esperando la respuesta indefinidamente.
Para evitar esta situación la función \texttt{sr1} de scapy permite
establecer un parámetro \textit{timeout} de espera.

En el caso de que se le pase como parámetro la dirección propia, podría pasar que
el host levante su propio broadcast y responda. Pero el caso es que al quedarse escuchando
paquetes para obtener la respuesta, no puede recibir el broadcast, con lo cual
queda en espera, de la misma manera que si la dirección fuese inexistente.

\subsection{Segunda consigna: encontrando los vendors}

El código propuesto para el \textit{sniffing} pasivo usa la función \texttt{sniff} de scapy.
Además definimos una función de mapeo que obtiene el nombre del vendor a partir de la dirección física.

\lstset{language=python,title={ARP: Sniffing - Vendors},caption={ARP: Sniffing - Vendors}}
\begin{footnotesize}
  \begin{lstlisting}[frame=bottomline]
  sniff(prn = procesador_de_paquetes, filter="arp", timeout=tout, iface=inter)

  def procesador_de_paquetes(p):
    if ARP in p:
      print p.summary()
      hwsrc = p[ARP].hwsrc
      print "hsaddr: ", hwsrc, " , vendor: ", get_vendor(hwsrc)
      print "[mensaje] de: " + p[ARP].psrc + " a: " + p[ARP].pdst

  def get_vendor(hwsrc):
    f = open("oui.txt")
    for l in f:
      if len(l.split()) >= 3:
	maskara = l.split()[0][0:8].replace("-", "").lower()
	if maskara == hwsrc[0:8].replace(":", "").lower():
	  return " ".join(l.strip().split()[2:])
  \end{lstlisting}
\end{footnotesize}

De esta manera, al interceptar un paquete ARP se ejecuta la función
\textit{procesador\_de\_paquetes} que imprime toda la información
necesaria para su posterior análisis.

Para obtener los nombres de los vendors a partir de la dirección MAC
creamos un parser del archivo \texttt{out.txt} que contiene el mapeo
entre los primeros tres bytes de una dirección MAC al fabricante del dispositivo.

Los siguientes son los Vendor obtenidos:

\begin{itemize}
  \item Apple, Inc.
  \item Askey Computer
  \item ASUSTek COMPUTER INC.
  \item CADMUS COMPUTER SYSTEMS
  \item Hewlett-Packard Company
  \item Liteon Technology Corporation
  \item Motorola Mobility, Inc.
  \item Nokia Corporation
  \item Nokia Danmark A/S
  \item PEGATRON CORPORATION
  \item PRIVATE
  \item RIM
  \item Samsung Electro Mechanics
  \item Samsung Electronics Co.,Ltd
  \item Sony Ericsson Mobile Communications AB
  \item Xensource, Inc.
\end{itemize}

\subsection{Tercera consigna: gráficos y análisis}

\input{analisis.tex}
